Corda Hands-on 後編
Cordapp開発 練習問題
絶対に必要なもの
git
トレーニングリポジトリをcloneしておいてください
git clone git@github.com:kotaro-dr/corda-training-template.git
JDK 8 (8以上ではなく、8)
java -version でJavaのバージョン確認できます。
KotlinはGradleやIntelliJにバンドルされてるので、自前でインストールする必要はない。
Gradleはgradlewというラッパーがリポジトリに入ってるので、自前でインストールする必要はない。
JDK 8とgitだけあれば動くはず。
なくても頑張れるが、コードいじったり実装するならほぼ必須なもの
IDE
IntelliJにcorda-training-templateを導入する方法
cordas-training-templateリポジトリをIntelliJでOpenする
File->Project Structureを開いて Project SDKをJDK 1.8, Project languageをJava 8にしてApply-> OK
右下にImport Gradle Project のpopupが出ている場合は, importをクリック.
popupが出ていない場合は、Project Structure->Modulesで + -> Import をクリックし、corda-training-templateリポジトリを選択し、Gradleを選択して、OKをクリックする.
実装言語
javaとkotlinの選択肢があるが、以下はkotlin前提で書いていく。
javaの場合でも大きな変化はないので、以下の文章も参考になると思う。
単体テストコマンド
code:bash
./gradlew kotlin-source:cleanTest kotlin-source:test
テストが落ちると以下のようなメッセージが出力される。
code:test_result
Task :kotlin-source:test
net.corda.training.contract.IOUSettleTests > onlyPaidPropertyMayChange FAILED
java.lang.AssertionError at IOUSettleTests.kt:381
IntelliJでの環境構築方法はREADMEに書いてあるのでそちらを見て設定してください。
Run/Debug ConfigurationsのJUnit設定でVM optionsに
-ea -javaagent:/<絶対パス>/corda-training-template/lib/quasar.jar
を設定するのがコツです。
ノードデプロイコマンド
code:bash
./gradlew kotlin-source:deployNodes
以下のノードをデプロイする
Notary
ParticipantA
ParticipantB
ParticipantC
具体的にはkotlin-source/build/nodesの中にCordaノードやWebサーバの設定ファイルが展開される。
ノード起動コマンド
code:bash
./kotlin-source/build/nodes/runnodes
このコマンドを実行するとターミナルが次々と開き、CordaノードやWebサーバが起動していく。この時に全てのターミナルが開き終えるまで他のウィンドウをアクティブにしてはいけない。(コマンド自体の終了は待たなくていい)
shuntak.icon < なんでや…
.bashrcにたくさん設定を書いているなど、ターミナルの起動が遅い場合、コマンドが同じウィンドウで実行されてしまう場合がある。その場合Cordaターミナルでbashスクリプト実行しようとして失敗してると思うので、冷静に失敗したコマンドをコピペして再度実行すれば良い。
コマンドを実行すると、Cordaノード、RPCサーバ、Webサーバがそれぞれkotlin-source/build.gradleに指定されたポートで起動する。
また、Webサーバに/web/iouでアクセスするとsrc/main/resources/iouWeb/に配置されたHTMLが配信される。
さらに、Webサーバに/api/iouでアクセスするとIOUApiで実装されるAPIが提供される。
実装するもの (Cordapp)
READMEにある通り、以下を実装する。
1. IOUState
2. IOUContract
3. IOUIssueFlow
4. IOUTransferFlow
5. IOUSettleFlow
コメントアウトされた単体テストがあるので、そちらのコメントを一つずつ解除しながら実装を進めていけば良い。
テストは以下の順で進めていく。
1. IOUStateTests
2. IOUIssueTests
3. IOUIssueFlowTests
4. IOUTransferTests
5. IOUTransferFlowTests
6. IOUSettleTests
7. IOUSettleFlowTests
仕様
Issue
借り手が貸し手に対して発行する
両者が署名する
Transfer
貸し手が新たな貸し手に移転する
借り手、元の貸し手、新たな貸し手の三者が署名する
Settle
借り手が貸し手にお金を送る
IOUStateだけでなくCash.StateもFlowに乗ってくる
両者の署名
実装するもの (Web frontend, HTTP API)
src/main/resources/iouWeb に java-sourceの方からHTML/CSS/JSをコピペして持ってくる。
また、src/main/kotlin/.../api/IOUApiにissueIOUという関数がコメントアウトされているので解除しておく。
さらに、issueIOU関数とフロントエンドのcreateIOUModal.jsで呼び出す際のHTTPメソッドがずれているので、統一しておく。
これを実装すると、Webサーバの/web/iouにて以下のような画面が提供される。
https://gyazo.com/6f5bcc77910d21a8b0c12b8d556e9d5a
みんなのハンズオン所感
実際にコードを書くことによって理解が深まった。Key Conceptも分かりやすかったが、言葉ではなく心で理解できた
Solidityのように振る舞いを実装するのと違い、Cordaはバリデーションを通るような入出力の結果を与えるというもので、全くパラダイムが異なっていて面白かった。
今回はコントラクトのvalidationに通りさえすれば自動的に署名するようになっていたが、IOU Issue時の額が正しいか等の確認フローを通ってから署名するようにしたい場合どうすればいいかまだ分からない。